#!/usr/bin/env bash

. ./test.common

test_start "leap second"

check_config_h 'FEAT_REFCLOCK 1' || test_skip

export CLKNETSIM_START_DATE=$(TZ=UTC date -d 'Dec 30 2008 0:00:00' +'%s')

limit=$[4 * 24 * 3600]
client_start=$[2 * 3600]
refclock_jitter=1e-9

for dir in "+1" "-1"; do
	leap=$[2 * 24 * 3600 + 1 + $dir]
	server_conf="refclock SHM 0 dpoll 10 poll 10
	leapseclist tmp/leap.list"
	refclock_offset="(* $dir (equal 0.1 (max (sum 1.0) $leap) $leap))"

	cat > tmp/leap.list <<-EOF
		#$	3676924800
		#@	3928521600
		3345062400	33	# 1 Jan 2006
		3439756800	$[33 - $dir]	# 1 Jan 2009 $(
		[ "$dir" = "+1" ] && echo -e "\n3471292800	33\n3502828800	34")
		3550089600	35	# 1 Jul 2012
	EOF

	for leapmode in system step slew; do
		client_conf="leapsecmode $leapmode"
		if [ $leapmode = slew ]; then
			max_sync_time=$[2 * 24 * 3600 + 13]
		else
			max_sync_time=$[2 * 24 * 3600 + 1]
		fi
		min_sync_time=$[$max_sync_time - 2]

		run_test || test_fail
		check_chronyd_exit || test_fail
		check_source_selection || test_fail
		check_packet_interval || test_fail
		check_sync || test_fail
		check_file_messages "System clock TAI offset set to" 1 1 log.1 || test_fail
		check_file_messages "System clock TAI offset set to 33" 1 1 log.1 || test_fail
	done

	client_server_options="trust"
	client_conf="refclock SHM 0 dpoll 10 poll 10 delay 1e-3"
	min_sync_time=$[$leap - 2]
	max_sync_time=$[$leap]

	run_test || test_fail
	check_chronyd_exit || test_fail
	check_source_selection || test_fail
	check_packet_interval || test_fail
	check_sync || test_fail

	client_server_options=""
	client_conf="leapsecmode system"
	min_sync_time=230000
	max_sync_time=240000

	for smoothmode in "" "leaponly"; do
		server_conf="refclock SHM 0 dpoll 10 poll 10
		leapseclist tmp/leap.list
		leapsecmode slew
		smoothtime 400 0.001 $smoothmode"

		run_test || test_fail
		check_chronyd_exit || test_fail
		check_source_selection || test_fail
		check_packet_interval || test_fail
		check_sync || test_fail
	done
done

if TZ=right/UTC date -d 'Dec 31 2008 23:59:60' 2> /dev/null | grep :60; then
	server_conf="refclock SHM 0 dpoll 10 poll 10
	leapsectz right/UTC"
	refclock_offset="(* -1 (equal 0.1 (max (sum 1.0) $leap) $leap))"
	client_conf="leapsecmode system"
	min_sync_time=$[$leap - 2]
	max_sync_time=$[$leap]

	run_test || test_fail
	check_chronyd_exit || test_fail
	check_source_selection || test_fail
	check_packet_interval || test_fail
	check_sync || test_fail
fi

test_pass
